/**
 * 
 */
package interfaz;

import java.awt.Color;
import java.awt.Toolkit;

import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.geom.Rectangle2D;
import java.util.Vector;

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;

import logica.analizador.DocumentoJerarquicoEnlazado;
import logica.common.NodoColor;
import logica.common.NodoVinculo;
import logica.estructura.RedSemantica;
import resources.Grafo.*;

import org.jgraph.JGraph;
import org.jgraph.graph.DefaultCellViewFactory;
import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.DefaultGraphModel;
import org.jgraph.graph.DefaultPort;
import org.jgraph.graph.GraphConstants;
import org.jgraph.graph.GraphLayoutCache;
import org.jgraph.graph.GraphModel;

import excepciones.ContenidoException;
import excepciones.DataStructureException;



/**
 * @author renzo
 *
 */
public class Grafo extends JFrame implements WindowListener{

	private static final long serialVersionUID = 1L;
	private JScrollPane jScrollPane = null;
	private resources.Grafo.Grafo grafo;
	private String texto;
	/**
	 * This is the default constructor
	 */
	public Grafo(String texto) {
		super();
		this.texto=texto;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(751, 564);
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		double fil=dim.getWidth();
		double col=dim.getHeight();
		fil=(fil-751)/2;
		col=(col-564)/2;
		this.setLocation((int)fil, (int)col);
		this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		this.crearGrafo();
		this.setContentPane(getJScrollPane(this.graficar(grafo)));
		this.setTitle("Grafo");
		this.addWindowListener(this);
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane(JGraph grafo) {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane(grafo);
		}
		return jScrollPane;
	}
	
	@SuppressWarnings("unchecked")
	private JGraph graficar(resources.Grafo.Grafo grafo)
	{
		try {
			GraphModel gm = new DefaultGraphModel();
			GraphLayoutCache view = new GraphLayoutCache(gm,new DefaultCellViewFactory());
			JGraph graph = new JGraph(gm, view);
			DefaultGraphCell[] nodos = new DefaultGraphCell[grafo.listaNodos().size()+ grafo.getEnlaces().size()];
			
			Vector<Object> datos=new Vector<Object>();
			DocumentoJerarquicoEnlazado dJE1;
			
			dJE1 = new DocumentoJerarquicoEnlazado(texto);
			
			
			for(int i=0; i<grafo.listaNodos().size(); i++){
				
				
				Integer a=((NodoColor)grafo.listaNodos().elementAt(i)).getColor().elementAt(0);
				Integer b=((NodoColor)grafo.listaNodos().elementAt(i)).getColor().elementAt(1);
				Integer c=((NodoColor)grafo.listaNodos().elementAt(i)).getColor().elementAt(2);
				
				
				datos= dJE1.getSeccion(((NodoColor)grafo.listaNodos().elementAt(i)).getValor().toString());
				
				int contador=0;
				for(int j=0;j<datos.size();j++)
				{
					if(datos.elementAt(j) instanceof String)
					{
						contador=contador+((String)datos.elementAt(j)).length();
					}
					else
					{
						contador=contador+((NodoVinculo)datos.elementAt(j)).getEtiqueta().length();
					}
				}
				
				int x=contador*50/80;
				int y=contador*25/40;
				
				if(x>200)
				{
					x=200;
				}
				if(y>200)
				{
					y=200;
				}
				
				nodos[i] = new DefaultGraphCell(((NodoColor)grafo.listaNodos().elementAt(i)).getValor().toString());
				
				GraphConstants.setBounds(nodos[i].getAttributes(), new Rectangle2D.Double((int) (Math.random()*500) ,(int) (Math.random()*400),40+x,40+y));
				GraphConstants.setGradientColor(nodos[i].getAttributes(),new Color(a,b,c));
				GraphConstants.setOpaque(nodos[i].getAttributes(), true);
				DefaultPort port0 = new DefaultPort();
				nodos[i].add(port0);		
			}
			
			int inicio=0;
			int destino=0;
			
			for(int i=0; i<grafo.getEnlaces().size(); i++){
				for(int j=0; j<grafo.listaNodos().size(); j++){
					if(((Enlace)grafo.getEnlaces().elementAt(i)).getInicio().equals(grafo.listaNodos().elementAt(j))){
						inicio = j;
					}
					if(((Enlace)grafo.getEnlaces().elementAt(i)).getDestino().equals(grafo.listaNodos().elementAt(j))){
						destino = j;
					}
				}
				
				DefaultEdge edge = new DefaultEdge();
				edge.setSource(nodos[inicio].getChildAt(0));
				edge.setTarget(nodos[destino].getChildAt(0));
				nodos[grafo.listaNodos().size()+i]=edge;
				int arrow = GraphConstants.ARROW_CLASSIC;
				GraphConstants.setLineEnd(edge.getAttributes(), arrow);
				GraphConstants.setEndFill(edge.getAttributes(), true);
				
			}
			
			graph.getGraphLayoutCache().insert(nodos);
			
			return graph;
			
		} catch (ContenidoException e) {
			JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
		} catch (DataStructureException e) {
			JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
		}
		
		return null;
	}

	@Override
	public void windowActivated(WindowEvent e) {
	}

	@Override
	public void windowClosed(WindowEvent e) {
	}

	@Override
	public void windowClosing(WindowEvent e) {
		RSemantica rs=new RSemantica(texto);
		this.setVisible(false);
		rs.setVisible(true);
		this.dispose();
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
	}

	@Override
	public void windowIconified(WindowEvent e) {
	}

	@Override
	public void windowOpened(WindowEvent e) {
	}
	
	private void crearGrafo()
	{
		DocumentoJerarquicoEnlazado dJE1;
		
			try {
				dJE1 = new DocumentoJerarquicoEnlazado(texto);
				grafo = new RedSemantica (dJE1);
			} catch (ContenidoException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			} catch (DataStructureException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			}		
	}
	
}  //  @jve:decl-index=0:visual-constraint="10,10"
